home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 November / Chip Kasım 2000.iso / prog / kasim / 17 / setup.exe / install.pl < prev    next >
Encoding:
Text File  |  2000-09-28  |  15.2 KB  |  577 lines

  1. #INSTALLATION PROGRAM FOR WEBTEACHER'S WEBDATA 2.3x
  2. #
  3. #TO USE, PLACE THIS SCRIPT AND THE webdata.cgi SCRIPT IN 
  4. #A DIRECTORY UNDER YOUR HOMEPAGES. (ie. viewable from the web).
  5. #THEN, FROM A COMMAND LINE, TYPE:  perl install.pl
  6. #DETAILS ABOUT EACH QUESTION ARE IN THE readme.html FILE.
  7. #
  8.  
  9.  
  10. if ($^O=~/Win/i) {
  11.   $slash="\\\\";
  12.   $isUnix=0;
  13. } else {
  14.   $slash="/";
  15.   $isUnix=1;
  16. }
  17.  
  18.  
  19. print "
  20. Welcome to the installer program for webdata, the easiest database program 
  21. for the world wide web.  The installer will ask you a few questions about
  22. your server.  You should complete the worksheet included in the readme.html
  23. document before continuing. By pressing \'y\' you are agreeing to absolve the
  24. authors of all liability related to use of this program.
  25.  
  26. Would you like to continue? [y,n]
  27. ";
  28. $_ = <STDIN>;
  29. if (/^n/i) {exit;}; 
  30.  
  31. &detect;
  32.  
  33. print "
  34. Choose a short name for this database:
  35. ";
  36. $dbname=<STDIN>;
  37. chop($dbname);
  38.  
  39. $webdata = "webdata_$dbname".".pl";
  40. $userform = $dbname."_form.html";
  41. $admin = $dbname."_admin.html";
  42. $memberentry = $dbname."_members.html";
  43. $instantmember= $dbname."_instantmember.html";
  44. $webdatafields = $dbname."_fields.log";
  45. $datalog = $dbname."_data.log";
  46. $memberfile = $dbname."_members.log";
  47. $reportpref= $dbname."_report.log";
  48.  
  49. print "\n\n
  50. CGI scripts can live in one of two places, depending on
  51. how your server is configured.  If your server uses the 
  52. cgi-bin directory, you will be prompted for the path
  53. to the cgi-bin, and this installer will move the
  54. program there.  Otherwise, if your server allows you to execute
  55. CGI scripts in any directory, you can place them with
  56. the HTML pages in any directory under your homepage.
  57. ";
  58. print "\n
  59. Where will the CGI scripts live on your server?
  60. 1. In the cgi-bin directory
  61. 2. In the same directory as the HTML pages
  62. 3. I'm not sure
  63. ";
  64. $cgichoice = <STDIN>;
  65. if ($cgichoice==1) {&cgibin}
  66. elsif ($cgichoice==2) {
  67.   $webdata="webdata_$dbname".".cgi";
  68.   $dirname=$webdata;
  69. }
  70. else {¬sure};
  71.  
  72. if ($isUnix) {
  73.   $isPerl5=0;
  74.   @possiblePaths=('/usr/bin/perl','/usr/local/bin/perl','/usr/bin/perl5','/usr/local/bin/perl5');
  75.   foreach (@possiblePaths) {
  76.     $testpath=`$_ -v`;
  77.       if ($testpath =~ /v(ersion)?[ \.]*([5-9])/i) {
  78.       print "\nPerl $1 has been detected at $_\n";
  79.       $isPerl5=1;
  80.       $perlpath=$_;
  81.       last;
  82.     }
  83.   }
  84.   
  85.   
  86.   while (!$isPerl5) {
  87.     print "\nWhat is the PATH to Perl version 5 on your machine? \n";
  88.     $perlpath = <STDIN>;
  89.     chop($perlpath);
  90.     $testpath=`$perlpath -v`;
  91.     if ($testpath =~ /version [5-9]/i) {
  92.       $isPerl5=1; 
  93.     } else {
  94.       print "$perlpath is not a valid path to Perl 5.  \n$perlpath -v returned this:\n$testpath\n\n";
  95.       print "Please enter another path, or press [CTRL]-c to quit \nand check with your system administrator.\n";
  96.     }
  97.   }
  98.   if (!($perlpath =~ /^\//)) {$perlpath = "/$perlpath"};  
  99.  
  100. $password=" ";  
  101. $now=$now*307;
  102. until ($password eq $second) {  
  103.   if ($password ne " ") {print "Not a match, try again.\n\n"};  
  104.   print "\nWhat would you like your password to be?\n"; 
  105.   $password = <STDIN>;   
  106.   print "\nPlease enter your password again.\n";  
  107.   $second = <STDIN>;
  108. }  
  109. chop($password);
  110. print "\n";
  111.  
  112. open(CGIREAD,"<webdata.cgi"); 
  113. @lines = <CGIREAD>;  
  114. close CGIREAD;  
  115. if ($isUnix) {
  116.   $path = `pwd`;
  117. } else {
  118.   $path = `chdir`;
  119. chop($path);
  120. $idcode=substr($now,-4);
  121. if (length($oc)>0) {$idcode=$oc}; 
  122.  
  123. print "\nThe ABSOLUTE PATH to the current directory is $path\n";  
  124. print "What is the URL to the current directory?\n"; 
  125. print "(start with http://)\n"; 
  126. $pathurl=<STDIN>;
  127. chop($pathurl);
  128. chop($pathurl) if $pathurl=~/\/$/;
  129. if (!(-e './uploads')) {
  130.   if (!mkdir(uploads,0777)) { 
  131.     print "ERROR! Could not create uploads directory in $path \n";
  132.     print "Check that you have write permission to this directory.\n\n";
  133.     exit;
  134.   }
  135. }
  136. $cmd=`chmod 777 uploads` if $isUnix;
  137. $uploadsdir="$path";
  138. if (!$isUnix) {$uploadsdir=~s#\\#\\\\#g};
  139. $uploadsdir.="${slash}uploads${slash}";
  140. $uploadsURL="${pathurl}/uploads/";
  141.  
  142. if ($cgichoice==1) {
  143.   $logdir=$pathToCgiBin;
  144. } else {
  145.   &getLogDir;
  146. }
  147.  
  148. sub getLogDir {
  149. print "\nThe log files contain all of your data, fields, members, and preferences.
  150. For security reasons, we recommend you store these files in a directory which outside the
  151. viewable web pages.  A typical directory structure might look like this:
  152.  
  153.                 |-----------|
  154.                 | top level |
  155.                 |___________|
  156.                   /       \\
  157.                  /         \\
  158.     |----------------|   |---------------|
  159.     | all .html pages|   |    logfiles   |
  160.     | and other web  |   | (not viewable |
  161.     | related stuff  |   |  via the web) |
  162.     |________________|   |_______________|
  163.  
  164. ";
  165. $isLogdir=0;
  166. until($isLogdir) {
  167.   print "Your current directory path is $path 
  168. Enter the path to the directory you would like to use for the log files.
  169. If the directory you enter does not exist, the installer will try to create it.
  170. Press [ENTER] to use the current directory.
  171. ";
  172.   $logdir=<STDIN>;
  173.   chop($logdir);
  174.   $wherelogs=0;
  175.   while ($logdir =~ /^\./) {
  176.     print "\nPlease use absolute paths only\n";
  177.     print "Enter the path to the directory you would like to use for the log files.\n";
  178.     print "Press [ENTER] to use the current directory.\n";
  179.     $logdir=<STDIN>;
  180.     chop($logdir);
  181.   }
  182.   if ($logdir =~/^$/) {$wherelogs='2'}
  183.   if (!(-e $logdir)) {
  184.     if (!mkdir($logdir,0755)) {
  185.       while($wherelogs!~/1|2/) {
  186.     print "The installer did not find $logdir and could not create it.\n\n";
  187.     print "Please choose what you would like to do:\n";
  188.     print "  1) Enter another path for the logs directory.\n";
  189.     print "  2) Put the logs in the current directory for now.\n";
  190.     $wherelogs=<STDIN>;
  191.     chop($wherelogs);
  192.       };
  193.       if ($wherelogs==2) {
  194.     print "\nThe log files will be placed in the current directory, $path \n";
  195.     print "If you wish to move them later, simply change the value of \$logdir \n";
  196.     print "in line 10 of the $webdata script.\n\n\n\n";
  197.     $logdir="${path}";
  198.     $isLogdir=1;
  199.       };
  200.     } else {
  201.       print "\nCreated new directory at $logdir\n\n";
  202.       $isLogdir=1;
  203.     };
  204.   } else {
  205.     $isLogdir=1;
  206.   };
  207. };
  208. print "Press [ENTER] to continue...\n";
  209. $tmp=<STDIN>;
  210. }
  211.  
  212. $logdirDisplay=$logdir;
  213. $logdirDisplay=~s#\\#\\\\#g;
  214. $logdir.=$slash if ($logdir!~/${slash}$/);
  215. $logdirDisplay.=$slash if ($logdirDisplay!~/${slash}$/);
  216. $logdirDisplay="" if $cgichoice==1;
  217.  
  218.  
  219. $lines[0]='#!'."$perlpath\n";
  220. $lines[5]="\$uploadsdir=\'$uploadsdir'\; #Must end with a $slash\n";
  221. $lines[6]="\$uploadsURL=\'$uploadsURL'\; #Must end with a /\n";
  222. $lines[7]="\$password=\"$password\"\;\n";
  223. $lines[9]="\$logdir=\'$logdirDisplay'\; #Must end with a $slash or is empty if log files are local to script.\n";
  224. $lines[11]="\$logfile=\"\${logdir}$datalog\"\;\n";
  225. $lines[12]="\$fieldnames=\"\${logdir}$webdatafields\"\;\n";
  226. $lines[13]="\$members=\"\${logdir}$memberfile\"\;\n";
  227. $lines[14]="\$reportdata=\"\${logdir}$reportpref\"\;\n";
  228. $lines[15]="\$code=\'$idcode\'\;\n";
  229.  
  230. foreach (@lines) {
  231.   if (/<!--FLAG5-->/) {$_="\$key=$now\; #<!--FLAG5-->\n"};
  232. };
  233.  
  234.  
  235. open(CGIWRITE,">$webdata");
  236. print CGIWRITE (@lines);
  237. close CGIWRITE;
  238.  
  239. sub cgibin {
  240.   $dirname="/cgi-bin/$webdata";
  241.   $valid="false";
  242.  
  243. if ($isUnix) {
  244.   $path = `pwd`;
  245. } else {
  246.   $path = `chdir`;
  247. chop($path);
  248. @cgipaths=split(/[\\\/]/,$path);
  249.   while ($#cgipaths>=0) {
  250.     $cgitestpath=join($slash,@cgipaths,"cgi-bin");
  251.     $cgitestpath=~s/\\\\/\\/g;
  252.     if (-e $cgitestpath) {
  253.       push(@cgiresults,$cgitestpath);
  254.     }
  255.     pop(@cgipaths);
  256.   }
  257.   if ($#cgiresults>-1) {
  258.     print "\nA directory named cgi-bin has been detected at the following location(s):\n\n";
  259.     for($i=1;$i<=$#cgiresults+1;$i++) {
  260.       print "\t$i\. $cgiresults[$i-1]\n"
  261.     };
  262.     print "\n\nIf the correct path to the cgi-bin is shown above, 
  263. enter the number to its left. Otherwise, press [ENTER].\n\n";
  264.   };
  265.  
  266.   $cgiselection=<STDIN>;
  267.   chop($cgiselection);
  268.   if ($cgiselection=~/[1-$i]/) {
  269.     $cgiselection--;
  270.     $pathToCgiBin=$cgiresults[$cgiselection];
  271.     $valid="true";
  272.   }
  273.  
  274.  
  275.   while ($valid eq "false") {
  276.     print "\nPlease enter the path to the /cgi-bin/ directory:\n";
  277.     $pathToCgiBin = <STDIN> ;
  278.     chop($pathToCgiBin);
  279.     $_=$pathToCgiBin;
  280.     if ($isUnix) {
  281.       if (!(/^\//)) {$pathToCgiBin = "/$pathToCgiBin";};
  282.       if (!(/\/$/)) {$pathToCgiBin = "$pathToCgiBin/";};
  283.     };
  284.     if (!(-e $pathToCgiBin)) {
  285.       print "\n\nPath is invalid. ";
  286.       print "Try again, or press [CTRL]-c to exit.\n";
  287.     } else {
  288.       $valid="true";
  289.     };
  290.   };
  291. };
  292.  
  293. sub notsure {
  294.   print "
  295. If this is your first CGI, you need to know a little bit about
  296. the way your server is configured.  Ask your system administrator
  297. where you are permitted to have CGI scripts on this server.  We
  298. also recommend reading the first 5 pages of the CGI tutorial at 
  299. http://www.webteacher.com/perltour
  300.  
  301. It will help you feel a lot more comfortable with your server, and
  302. the Unix environment in general. \n\n";
  303.   
  304.   
  305.   print "
  306.  This program will now exit.  You
  307. should run it again when you know whether your server requires the
  308. CGI scripts to be in the /cgi-bin/ directory or not.
  309. ";
  310.   exit;
  311. };
  312. print "\n
  313. The Installer will help you define your list of fields.
  314. Fields are the attributes you wish to record about each entry,
  315. for example, FirstName, LastName, Color, Make, Model,  EntryDate, 
  316. PartNumber, etc.
  317.  
  318. Press [ENTER] when you are finished entering fields. If you make a mistake,
  319. press [ENTER] and choose No when asked if you are satisfied with the list.
  320.  
  321. "; 
  322.  
  323. $tryagain="true";
  324. while ($tryagain eq "true") {
  325. $time = time();
  326. @fields = ("webdata$time\n");
  327. print "Enter a field name: ";
  328. $field = <STDIN>;
  329. push(@fields,$field);
  330. $morefields="true";
  331. while ($morefields eq "true") {
  332.     print "Enter another field name: ";
  333.     $field  = <STDIN> ;
  334.     push(@fields,$field);
  335.     $_=$field;
  336.     if (/./) {$morefields = "true"} else {$morefields = "false"};
  337. };
  338. print "\n";
  339. pop(@fields);
  340. foreach $field (@fields) {
  341.   if (substr($field,0,7) ne 'webdata') {print "$field"};
  342. };
  343.  
  344. print "\nAre you satisfied with the field list? (y/n)";
  345. print "[Type \'y\' to keep the list, \'n\' to enter the fields again]";
  346. $tryagain = <STDIN>;
  347. $_=$tryagain;
  348. if (/^y/i) {$tryagain = "false"} else {$tryagain = "true"}
  349. }; 
  350.  
  351. foreach (@fields) {
  352. chop($_);
  353. $_=$_."::text:20\n";
  354. };
  355. if (length($odb)>0) {
  356.   @fields[0]=$odb;
  357. }
  358. open(FIELDLIST,">${logdir}$webdatafields");
  359. print FIELDLIST (@fields);
  360. close FIELDLIST;
  361.  
  362. $rc=@fields;
  363. for($i=0;$i<$rc-1;$i++) {
  364. $row.="$i:";
  365. };
  366. chop($row);
  367. open(REPORT,">${logdir}$reportpref");
  368. print REPORT
  369. ("BEIGE\n\n$row\n0\n0\n15\n0\n\n1\nview\n\n\n\n\n\n\n\n\n\n\n\nWHITE\nWHITE\nWHITE\n$row\n\n\n\n\n\n\n\n1\n$pathurl\n\n1\n1\n\n\n\n\n\nEnglish\n\n\n\n\n\n\n\n\n\n1\n\n\n1\n1\n1\n1\n\n");
  370. close REPORT;
  371. open(REPORT,">${logdir}$memberfile");
  372. print REPORT ("::nopass\n");
  373. close REPORT;
  374.  
  375.  
  376. open(FIELDS,"<$webdatafields");
  377. @fields = <FIELDS>;
  378. close FIELDS;
  379.  
  380. open(FORM,">$userform");
  381. $loc=$dirname."?cgifunction=user";
  382. print FORM ("
  383. <script language=\"javascript\">
  384. location.replace(\'$loc\')\;
  385. </script> 
  386. ");  
  387. close FORM; 
  388. qx(chmod 755 $userform) if $isUnix; 
  389.  
  390. open (ADMIN,">$admin"); 
  391. print ADMIN ("  
  392. <HTML>
  393. <HEAD>
  394. <TITLE> Web Data Administration Password </TITLE>
  395. </HEAD>
  396.  
  397. <BODY BGCOLOR=BEIGE onLoad=\"document.form1.password.focus()\">
  398. <H1 ALIGN=CENTER>
  399. YOU MUST HAVE A PASSWORD TO ENTER THE ADMINISTRATION SITE
  400. </H1> 
  401.  
  402. Enter password here:<BR>
  403. <FORM NAME=\"form1\" ACTION=\"$dirname\" METHOD=\"POST\">
  404. <INPUT TYPE=PASSWORD NAME=\"password\">
  405. <INPUT TYPE=HIDDEN NAME=\"cgifunction\" VALUE=\"admin\">
  406. <INPUT TYPE=SUBMIT VALUE=\"Enter\">
  407. </FORM>
  408.  
  409. </BODY>
  410. </HTML>
  411.  
  412. ");
  413. close ADMIN;
  414.  
  415. open (MEMBERPAGE,">$memberentry");
  416. print MEMBERPAGE ("
  417. <HTML>
  418. <HEAD>
  419. <TITLE> Web Data Member Password </TITLE>
  420. </HEAD>
  421.  
  422. <BODY BGCOLOR=BEIGE onLoad=\"document.form1.username.focus()\">
  423. <H1 ALIGN=CENTER>
  424. MEMBERS ENTRY PAGE.<BR>
  425. </H1>
  426.  
  427. <TABLE BORDER=0>
  428. <FORM NAME=\"form1\" ACTION=\"$dirname\" METHOD=\"POST\">
  429. <TR><TD><B>User Name</B><TD><INPUT TYPE=TEXT NAME=\"username\" SIZE=20><BR>
  430. <TR><TD><B>Password</B><TD><INPUT TYPE=PASSWORD NAME=\"password\" SIZE=20><BR>
  431. </TABLE>
  432. <INPUT TYPE=SUBMIT NAME=\"cgifunction\" VALUE=\"memberpage\">
  433. </FORM> 
  434. </BODY>
  435. </HTML>
  436.  
  437. ");
  438. close MEMBERPAGE;
  439.  
  440. open (INSTANTMEMBER,">$instantmember");
  441. print INSTANTMEMBER ("
  442. <HTML>
  443. <HEAD>
  444. <TITLE> Web Data Member Password </TITLE>
  445. </HEAD>
  446.  
  447. <BODY BGCOLOR=BEIGE onLoad=\"document.form1.username.focus()\">
  448. <H1 ALIGN=CENTER>
  449. Choose a Username and Password<BR>
  450. </H1>
  451.  
  452. <TABLE BORDER=0>
  453. <FORM NAME=\"form1\" ACTION=\"$dirname\" METHOD=\"POST\">
  454. <TR><TD><B>User Name</B><TD><INPUT TYPE=TEXT NAME=\"username\" SIZE=20><BR>
  455. <TR><TD><B>Password</B><TD><INPUT TYPE=PASSWORD NAME=\"password\" SIZE=20><BR>
  456. </TABLE>
  457. <INPUT TYPE=SUBMIT NAME=\"cgifunction\" VALUE=\"instantmember\">
  458. </FORM> 
  459. </BODY>
  460. </HTML> 
  461.  
  462. "); 
  463. close INSTANTMEMBER; 
  464.  
  465. if ($isUnix) {
  466.   qx(chmod 755 "$admin");
  467.   qx(echo 111::Delete Me::admin > ${logdir}$datalog);
  468.   qx(chmod 777 ${logdir}$datalog);
  469.   qx(chmod 777 ${logdir}$webdatafields);
  470.   qx(chmod 755 $webdata);
  471.   qx(chmod 755 $memberentry);
  472.   qx(chmod 755 $instantmember);
  473.   qx(chmod 777 ${logdir}$reportpref);
  474.   qx(chmod 777 ${logdir}$memberfile);
  475. }
  476. if ($cgichoice==1) {
  477.   if ($isUnix) {
  478.     qx(mv $webdata "$pathToCgiBin");
  479.   } else {
  480.     qx(move $webdata "$pathToCgiBin");
  481.   };
  482. };
  483.  
  484. if (!(-f 'index.html')) {
  485.   open(BACKDOOR,">index.html");
  486.   print BACKDOOR ("   
  487. <BODY BGCOLOR=\"WHITE\">
  488. Four pages have been created for your convenience in the
  489. current directory ($path).
  490. <P>
  491. Guests should be linked to <A HREF=\"$userform\">$userform</A> to search your database
  492. <P>
  493. Administrators should go to <A HREF=\"$admin\">$admin</A> to add, modify, and remove records,
  494. import and export, modify fields, and add members.
  495. <P>
  496. Members with accounts can go to <A HREF=\"$memberentry\">$memberentry</A> to add and modify only
  497. their own records.
  498. <P>
  499. If you choose to allow instant members (admin preferences) you can direct
  500. new members to <A HREF=\"$instantmember\">$instantmember</A>.
  501. <P>
  502.   ");
  503.   close BACKDOOR;
  504.   qx(chmod 755 index.html) if $isUnix;
  505. };
  506.  
  507. print "
  508. Four pages have been created for your convenience in the
  509. current directory ($path).
  510.  
  511. Guests should be linked to $userform to search your database
  512.  
  513. Administrators should go to $admin to add, modify, and remove records,
  514. import and export, modify fields, and add members.
  515.  
  516. Members with accounts can go to $memberentry to add and modify only
  517. their own records.
  518.  
  519. If you choose to allow instant members (admin preferences) you can direct
  520. new members to $instantmember.
  521.  
  522. If you have difficulty, please read the troubleshooting page at
  523. http://www.webteacher.com/perltour/testhelp.htm
  524.  
  525. ";
  526.  
  527. sub detect {
  528.   if ($isUnix) {
  529.     @installs=qx(ls);
  530.   } else {
  531.     @installs=qx(dir);
  532.   }
  533.   foreach (@installs) {
  534.     if (/(webdata_.*\.(cgi|pl))/i) {
  535.       $oldfile=$1;
  536.       last;
  537.     }
  538.   }
  539.   $now=time();
  540.   if (length($oldfile)>0) {
  541.     print "detected: $oldfile\n";
  542.     open (OFL,"<$oldfile");
  543.     @ofl=<OFL>;
  544.     close OFL;
  545.     if ($ofl[1]=~/2\.2/) { 
  546.       $oc=substr($ofl[14],7,4);
  547.       $odb=substr($ofl[11],13,99);
  548.       $odb=substr($odb,0,-3);
  549.       open (ODB,"<$odb");
  550.       @odbl=<ODB>;
  551.       close ODB;
  552.       $odb=$odbl[0];
  553.     }
  554.     if ($ofl[1]=~/2\.3/) {
  555.       $oc=substr($ofl[15],7,4);
  556.       if ($ofl[9]=~/\'(.+)\'/) {$odb=$1};
  557.          $odb=~s#\\\\#\\#g;
  558.       if ($ofl[12]=~/\}(.+)\"/) {$odb.=$1};
  559.       open (ODB,"<$odb");
  560.       @odbl=<ODB>;
  561.       close ODB;
  562.       $odb=$odbl[0];
  563.     }
  564.     print "Another copy if Webdata has been detected.
  565. The installer will match the registration info to the other database.
  566.  
  567. Press [ENTER] to continue\n";
  568. $foobar=<STDIN>;
  569.   };
  570. }
  571.  
  572. print "Press [ENTER] to finish";
  573. $tmp=<STDIN>;
  574.